# Series:一列
import pandas as pd
ser1=pd.Series(data=[320,180,300,405],index=['一季度','二季度','三季度','四季度'])
print(ser1)
ser2=pd.Series({'一季度':320,'二季度':180,'三季度':300,'四季度':405})
print(ser2)

#索引和切片
print(ser2['二季度'],ser2[1],ser2.iloc[1])
print(ser2['三季度':'四季度'],ser2[2:4])
print(ser2[['二季度','四季度']])
ser2[['二季度','四季度']]=888,999
print(ser2)
print(ser2[ser2>500])

#属性
print(ser2.dtype)   #数据列的数据类型
print(ser2.hasnans)   #有无空行
print(ser2[ser2>500].index) #获取索引
print(ser2.is_monotonic_decreasing) # 单调递减
print(ser2.is_monotonic_increasing)# 单调递增
print(ser2.size)  #有多少行
print(ser2.is_unique) # 有无重复 （True没有）
print(ser2.values) #获取数据

#Dataframe: 以列为主
df1=pd.DataFrame(data=[[17,86],[18,63],[23,43]],index=['张三','李四','王五'],columns=['语文','数学'])
print(df1)
df2=pd.DataFrame(data={'语文':[17,18,18],'数学':[76,65,34]},index=['张三','李四','王五'])
print(df2)
print(df2.head(1)) #开头n行，默认5行
print(df2.tail(1)) #最后n行，默认5行
df2.info() #Dataframe 基本信息

#索引和切片
print(df2['语文',df2.语文])
print(type(df2['语文'])) #Series是Datafram的切片
print(df2.loc['张三'],df2['语文'].loc['李四'],df2.loc['李四']['语文']) #loc[]获取某行
print(df2.iloc[1]) #iloc[]获取第X行
print(df2[['语文','数学']])
print(df2.loc[['张三','王五']])
print(df2[:],df2.loc['李四':])
print(df2[df2['数学']>80].index)

#数据筛选
print(df2[(df2['数学']>=60)&(df2['数学']<80)]) #数学成绩60~80
print(df2.query('数学 >= 60 数学 <80'))

#数据重塑
df3=pd.DataFrame(data={'语文':[28,31],'数学':[42,56]},index=['赵六','周七'])
df_all=pd.concat([df2,df3])
print(df_all)
df4=pd.DataFrame({'学号':['001','002','003'],'班级':["1班",'2班','3班']},index=['赵六','周祺','钱八'])
dfr=pd.merge(df3,df4,how='inner',left_index=True,right_index=True)
print(dfr)
print(pd.merge(df3,df4,how='left',left_index=True,right_index=True)) #左连接
print(pd.merge(df3,df4,how='right',left_index=True,right_index=True))# 右链接

# 统计：非数值列不能计算
print(df3.mean()) # 平均值
print(df3.count()) # 计数
print(df3.var()) # 方差
print(df3.std()) #标准差
print(df3.describe())
print(df3.mean(axis=1)) #移轴

#排序
print(df3.sort_values(by='数学',ascending=False)) # 按数学成绩降序排序
print(df3.nlargest(2,'语文')) # 语文成绩最高的两个
print(df3.nsmallest(2,'语文')) # 语文成绩最低的两个